package motor;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;

public class Oda {
	File file;
	BufferedWriter bw ;

	private String nombre;
	private String objdescripcion;
	private ArrayList<Atributo> atributo;
	private String metdescripcion;
	private String ciclovidaestado;
	private ArrayList<Entidad> entidad;
	private ArrayList<Clasificacion> clasificacion;
	private ArrayList<Recurso> recurso;


	public Oda(String sFile, String nombre, String objdescripcion,
			ArrayList<Atributo> atributo, String metdescripcion,
			String ciclovidaestado, ArrayList<Entidad> entidad,
			ArrayList<Clasificacion> clasificacion, ArrayList<Recurso> recurso) {
		super();
		this.nombre = nombre;
		this.objdescripcion = objdescripcion;
		this.atributo = atributo;
		this.metdescripcion = metdescripcion;
		this.ciclovidaestado = ciclovidaestado;
		this.entidad = entidad;
		this.clasificacion = clasificacion;
		this.recurso = recurso;
	}

	public Oda(){
		nombre ="";
		objdescripcion = "";
		atributo = new ArrayList<Atributo>();
		metdescripcion = "";
		ciclovidaestado = "";
		entidad = new ArrayList<Entidad>();
		clasificacion = new ArrayList<Clasificacion>();
		recurso = new ArrayList<Recurso>();		
	}

	public void export(String sFile){

		try {
			bw = new BufferedWriter(new FileWriter(sFile));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			//Datos del objeto
			bw.write(Bloques.head);
			bw.write(Bloques.nombre);
			bw.write(nombre);
			bw.write(Bloques.objdescripcion);
			bw.write(objdescripcion);
			bw.write(Bloques.finobjdescripcion);

			//Atributos
			if( !atributo.isEmpty()){	
				//Iterator it = atributo.iterator();
				for (int i = 0; i< atributo.size(); i++){
					bw.write(Bloques.natributo);
					bw.write(atributo.get(i).getNombre()+":");
					bw.write(Bloques.atributo);
					bw.write(atributo.get(i).getValor());			
					bw.write(Bloques.finatributo);	
				}
			}

			bw.write(Bloques.finDatos);

			//Metadatos
			bw.write(Bloques.metdescripcion);
			bw.write(metdescripcion);
			bw.write(Bloques.ciclovidaestado);
			bw.write(ciclovidaestado);

			for (Iterator<Entidad> it = entidad.listIterator();it.hasNext();){
				Entidad e = it.next();
				bw.write(Bloques.nombreentidad);
				bw.write(e.getNombre());					
				bw.write(Bloques.papelentidad);
				bw.write(e.getPapel());			
				bw.write(Bloques.fechaentidad);
				bw.write(e.getFecha());
				bw.write(Bloques.finentidad);
			}
			bw.write(Bloques.finciclovida);

			bw.write(Bloques.clasificacion);

			for (Iterator<Clasificacion> it = clasificacion.listIterator();it.hasNext();){
				Clasificacion e = it.next();
				bw.write(Bloques.fuente);
				bw.write(e.getFuente());					
				bw.write(Bloques.ruta);
				bw.write(e.getRuta());			
				bw.write(Bloques.taxon);
				bw.write(e.getTaxon());
				bw.write(Bloques.finclasificacion);
			}

			bw.write(Bloques.finmetadatos);


			//Recursos
			bw.write(Bloques.recursos);
			for (Iterator<Recurso> it = recurso.listIterator();it.hasNext();){
				Recurso e = it.next();
				bw.write(Bloques.id);
				bw.write(e.getId());					
				bw.write(Bloques.tipo);
				bw.write(e.getTipo());			
				bw.write(Bloques.recdescripcion);
				bw.write(e.getDescripcion());
				bw.write(Bloques.referencia);
				if (e.getReferencia().equals(""))
					bw.write("-");
				bw.write(e.getReferencia());
				bw.write(Bloques.finrec);
			}


			//final de la pagina
			bw.write(Bloques.fin);


		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		try {
			bw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	public void open(String sFile){
		FileInputStream filein;
		try {
			filein = new FileInputStream(sFile);
			ObjectInputStream datain = new ObjectInputStream(filein);
			
			//leyendo to
			atributo = (ArrayList<Atributo>)datain.readObject();
			ciclovidaestado = (String)datain.readObject();
			clasificacion = (ArrayList<Clasificacion>)datain.readObject();
			entidad = (ArrayList<Entidad>)datain.readObject();
			metdescripcion = (String)datain.readObject();
			nombre = (String)datain.readObject();
			objdescripcion = (String)datain.readObject();
			recurso  = (ArrayList<Recurso>)datain.readObject();
			
			filein.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public void save(String sFile){		

		File file = new File(sFile);
		// Create an output stream to the file.
		FileOutputStream file_output;
		try {
			file_output = new FileOutputStream (file);
			// Wrap the FileOutputStream with a DataOutputStream
			ObjectOutputStream data_out = new ObjectOutputStream (file_output);
			
			//escribiendo to
			data_out.writeObject(atributo);
			data_out.writeObject(ciclovidaestado);
			data_out.writeObject(clasificacion);
			data_out.writeObject(entidad);
			data_out.writeObject(metdescripcion);
			data_out.writeObject(nombre);
			data_out.writeObject(objdescripcion);
			data_out.writeObject(recurso);
			
			//cerrando
			file_output.close();
			
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}




	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @param nombre the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * @return the objdescripcion
	 */
	public String getObjdescripcion() {
		return objdescripcion;
	}

	/**
	 * @param objdescripcion the objdescripcion to set
	 */
	public void setObjdescripcion(String objdescripcion) {
		this.objdescripcion = objdescripcion;
	}

	/**
	 * @return the atributo
	 */
	public ArrayList<Atributo> getAtributo() {
		return atributo;
	}

	/**
	 * @param atributo the atributo to set
	 */
	public void setAtributo(ArrayList<Atributo> atributo) {
		this.atributo = atributo;
	}

	/**
	 * @return the metdescripcion
	 */
	public String getMetdescripcion() {
		return metdescripcion;
	}

	/**
	 * @param metdescripcion the metdescripcion to set
	 */
	public void setMetdescripcion(String metdescripcion) {
		this.metdescripcion = metdescripcion;
	}

	/**
	 * @return the ciclovidaestado
	 */
	public String getCiclovidaestado() {
		return ciclovidaestado;
	}

	/**
	 * @param ciclovidaestado the ciclovidaestado to set
	 */
	public void setCiclovidaestado(String ciclovidaestado) {
		this.ciclovidaestado = ciclovidaestado;
	}

	/**
	 * @return the entidad
	 */
	public ArrayList<Entidad> getEntidad() {
		return entidad;
	}

	/**
	 * @param entidad the entidad to set
	 */
	public void setEntidad(ArrayList<Entidad> entidad) {
		this.entidad = entidad;
	}

	/**
	 * @return the clasificacion
	 */
	public ArrayList<Clasificacion> getClasificacion() {
		return clasificacion;
	}

	/**
	 * @param clasificacion the clasificacion to set
	 */
	public void setClasificacion(ArrayList<Clasificacion> clasificacion) {
		this.clasificacion = clasificacion;
	}

	/**
	 * @return the recurso
	 */
	public ArrayList<Recurso> getRecurso() {
		return recurso;
	}

	/**
	 * @param recurso the recurso to set
	 */
	public void setRecurso(ArrayList<Recurso> recurso) {
		this.recurso = recurso;
	}
}
